/*
Date:20210603 23:00

key:又是前缀和+哈希，哈希存储前缀和的结果和它第一次出现的索引.-1与-1相同，并不是只有0之间才是同个数
    [1,0,0,1,0,0,0,1,1,1,0,0]
    1 0 -1 0 -1 -2 -3 -2 -1 0 -1 -2 
*/
class Solution {
public:
    int findMaxLength(vector<int>& nums) 
    {
        //pair<int,int>p;
        vector<pair<int,int>>v;
        const int n=nums.size();
        for(int i=0;i<n;i++)
        {
            if(nums[i]==0){nums[i]=-1;}
        }
        
        unordered_map<int,int>m;
        int tmp,Max=0;
        m.insert(pair<int,int>(0,-1));
        for(int i=0;i<n;i++)
        {
            if(i==0){tmp=nums[0];}
            else
            {
                tmp+=nums[i];
            }
            auto g=m.find(tmp);
            if(g==m.end())
            {
                m.insert(pair<int,int>(tmp,i));
            }
            else
            {
                Max=max(Max,(i-g->second));
            }
            //cout<<tmp<<" ";
        }

        return Max;
    }
};